package br.com.beans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

import br.com.dao.CidadeDAO;
import br.com.dao.EstadoDAO;
import br.com.dao.PaisDAO;

/** Classe que representa um endereco */
@SuppressWarnings("serial")
@Embeddable
public class Endereco implements Serializable {

	/** Logradouro (rua, avenida, praca, etc) */
	@Column(length=80,name="endLogradouro",nullable=false)
	private String logradouro;
	
	/** Numero da casa, predio, etc */
	@Column(length=20,name="endNumero",nullable=false)
	private String numero;
	
	/** Bairro */
	@Column(length=20,name="endBairro",nullable=false)
	private String bairro;
	
	/** CEP (length=9,padrao xxxxx-xxx) */
	@Column(name="endCep",nullable=false)
	private String cep;

	/** Cidade */
	@ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="codCidade",nullable=false)
	private Cidade cidade = new Cidade();
	
	/** Estado */
	@ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="codEstado",nullable=false)
	private Estado estado = new Estado();
	
	/** Construtor padrao */
	public Endereco(){}
	
	/** Construtor de copia */
	public Endereco(Endereco endereco) {
		copiar(endereco);
	}

	/** Limpa todos atributos. */
	public void limpar() {
		logradouro  = null;
		numero      = null;
		bairro      = null;
		cep         = null;
		cidade      = new Cidade();
		estado      = new Estado();
	}

	/** Copia atributos de outro objeto.
	 *  @param obj Objeto a ser copiado */
	public void copiar(Endereco obj) {
		if (obj != null) {
			logradouro  = obj.logradouro;
			numero      = obj.numero;
			bairro      = obj.bairro;
			cep         = obj.cep;
			cidade      = new Cidade(obj.cidade);
			estado      = new Estado(obj.estado);
		} else {
			limpar();
		}
	}
	
	/** Retorna lista com nomes de estados para o Brasil.
	 *  @return Lista com nomes de estados. */
	public List<String> getListaEstados() {
		PaisDAO paisDAO = new PaisDAO();
		EstadoDAO estadoDAO = new EstadoDAO();
		List<String> resultado = new ArrayList<String>();

		Pais pais = paisDAO.localizar(1); // BRASIL
		List<Estado> estados = estadoDAO.listarPorPais(pais);
		if (estados != null) {
			for (Estado estadoObj : estados) {
				resultado.add(estadoObj.getNome());
			}
		}
		return resultado;
	}

	/** Retorna lista com nomes de cidades para o estado corrente.
	 *  @return Lista com nomes de cidades. */
	public List<String> getListaCidades() {
		EstadoDAO estadoDAO = new EstadoDAO();
		CidadeDAO cidadeDAO = new CidadeDAO();
		List<String> resultado = new ArrayList<String>();

		Estado estadoObj = estadoDAO.localizar(getEstado().getNome());
		List<Cidade> cidades = cidadeDAO.listarPorEstado(estadoObj);
		if (cidades != null) {
			for (Cidade cidadeObj : cidades) {
				resultado.add(cidadeObj.getNome());
			}
		}
		return resultado;
	}
	
	public String getLogradouro() {
		return logradouro;
	}

	public void setLogradouro(String logradouro) {
		this.logradouro = logradouro;
	}

	public String getNumero() {
		return numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}

	public String getBairro() {
		return bairro;
	}

	public void setBairro(String bairro) {
		this.bairro = bairro;
	}

	public String getCep() {
		return cep;
	}

	public void setCep(String cep) {
		this.cep = cep;
	}

	public Cidade getCidade() {
		return cidade;
	}

	public void setCidade(Cidade cidade) {
		this.cidade = cidade;
	}

	public Estado getEstado() {
		return estado;
	}

	public void setEstado(Estado estado) {
		this.estado = estado;
	}
}
